/*
 * Controller.cs : Controla os pedidos do utilizador e define rotas de execução.
 * 
 * Autor: Bruno Barbosa
 * Número: 5321
 * 
 * Sistema: Ubuntu 10.10
 * Aplicação: MonoDevelop v2.4
 * 
 */

using System;
using System.Collections.Generic;

namespace UniDP
{
	public class Controller
	{
		Model model;
		View view;
		bool ano, grau, estab;
		string strAno, strGrau, strEstab;
		
		/* Constructor */
		public Controller ()
		{
			this.model = new Model();
			this.view = new View();
		}
		
		/*
		 * Verifica se foram introduzidos sub-argumentos aos argumentos principais.
		 */
		public void subArguments(string[] args, int i){
			this.ano = false;
			this.grau = false; 
			this.estab = false;
			this.strAno = "";
			this.strGrau = "";
			this.strEstab = "";
			for(int p = 1; p < 4; p++) /* verifica os sub-argumentos */
			{ 
				if((i+p) < args.Length && args[i+p].StartsWith("--") == true)
				{	
					/* se existirem os argumentos, torna-os válidos */
					try{
						if (args[i+p].StartsWith("--ano") == true){ this.strAno = args[i+p].Substring(6); this.ano = true; } 
						if (args[i+p].StartsWith("--grau") == true) { this.strGrau = args[i+p].Substring(7); this.grau = true; }
						if (args[i+p].StartsWith("--estabelecimento") == true){ this.strEstab = args[i+p].Substring(18); this.estab = true; }
					}catch{
						this.view.toolOptions();
					}
				}
			}
		}
		
		/*
		 * Verifica os argumentos introduzidos no programa, 
		 * faz a chamada ao model para realizar as respectivas instrucções SQL.
		 * A view verifica o resultado do model e mostra ao utilizador.
		 */
		public void analyse(string[] args)
		{
			string argument="";
			int answer;
			List<string> listAnswer = new List<string>();
			for(int i = 0; i < args.Length ;i++){ 
				argument = args[i];
				switch (argument)
				{
					case "-c": // Conta Docentes
							this.subArguments(args, i);
							if ( this.ano == true && this.estab == true && this.grau == true &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >=0){

									answer = this.model.teacherNumber(1, this.strAno, this.strEstab, this.strGrau); //model
									this.view.countAnswer(1, answer, this.strAno, this.strEstab, this.strGrau); //view(model)
						
								}else if(this.ano == true && this.estab == true && this.grau == false){
									
									answer = this.model.teacherNumber(2, this.strAno, this.strEstab, null);
									this.view.countAnswer(2, answer, this.strAno, this.strEstab, null);
						
								}else if(this.ano == true && this.estab == false && this.grau == true){
									
									answer = this.model.teacherNumber(3, this.strAno, null, this.strGrau);
									this.view.countAnswer(3, answer, this.strAno, null, this.strGrau);
						
								}else if(this.ano == true && this.estab == false && this.grau == false){
									
									answer = this.model.teacherNumber(4, this.strAno, null, null);
									this.view.countAnswer(4, answer, this.strAno, null, null);
						
								}else this.view.toolOptions();
						break;
					case "-cD": // Conta Doutorados
							this.subArguments(args, i);
							if(this.ano == true && this.estab == true && this.grau == false &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >=0){
								answer = this.model.teacherNumber(5, this.strAno, this.strEstab, null);
								this.view.countAnswer(5, answer, this.strAno, this.strEstab, null);
							}
						break;

					case "-lE": // Lista Estabelecimentos
							this.subArguments(args, i);
							if(this.ano == true && this.estab == false && this.grau == false &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >=0){
								listAnswer = this.model.genLists(1, this.strAno, null, null);
								this.view.listAnswer(1, listAnswer, this.strAno, null, null);
							}
						break;
					case "-lP": // Lista Professores com Grau
							this.subArguments(args, i);
							if(this.ano == true && this.estab == false && this.grau == true &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >=0){
								listAnswer = this.model.genLists(2, this.strAno, null, this.strGrau);
								this.view.listAnswer(2, listAnswer, this.strAno, null, this.strGrau);
							}
						break;
					case "-lS": //Lista Saídas de Instituições
							this.subArguments(args, i);
							if(this.ano == true && this.estab == true && this.grau == false && 
					   			Convert.ToInt16(this.strAno) < 9 && Convert.ToInt16(this.strAno) >=0 ){
								listAnswer = this.model.genLists(3, this.strAno, this.strEstab, null);
								this.view.listAnswer(3, listAnswer, this.strAno, this.strEstab, null);
							}
						break;
					case "-lN": //Lista Novas Entradas Instituições
							this.subArguments(args, i);
							if(this.ano == true && this.estab == true && this.grau == false &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >0){
								listAnswer = this.model.genLists(4, this.strAno, this.strEstab, null);
								this.view.listAnswer(4, listAnswer, this.strAno, this.strEstab, null);
							}
						break;
					
					case "-lD": // Lista Doutorados
							this.subArguments(args, i);
							if(this.ano == true && this.estab == true && this.grau == false &&
					   			Convert.ToInt16(this.strAno) <= 9 && Convert.ToInt16(this.strAno) >=0){
								listAnswer = this.model.genLists(5, this.strAno, this.strEstab, null);
								this.view.listAnswer(5, listAnswer, this.strAno, this.strEstab, null);
							}
						break;
					
					case "-lM": // Lista Docentes que mudaram de Instituição
							this.subArguments(args, i);
							if(this.ano == true && this.estab == false && this.grau == false &&
					   			Convert.ToInt16(this.strAno) < 9 && Convert.ToInt16(this.strAno) >=0){
								listAnswer = this.model.genLists(6, this.strAno, null, null);
								this.view.listAnswer(6, listAnswer, this.strAno, null, null);
							}
						break;
					case "-h": this.view.toolOptions();
						break;
				}
			}
		}
		

	}
}

